package com.billdowney.util.return_type;

import java.util.HashMap;
import java.util.Map;

import javax.mail.MessagingException;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.mail.MailSendException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.AccountExpiredException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.CredentialsExpiredException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.multipart.MultipartException;

/**
 * 异常code工具
 * 
 * @author 超级小富翁 - BillDowney
 * @date 2019年2月11日 上午11:15:39
 */
public class ExceptionCodeUtil {

	private static Map<String, Integer> errorCodeMap = new HashMap<String, Integer>();

	static {
		// 参数不能为空
		errorCodeMap.put(MissingServletRequestParameterException.class.getName(), 10002);
		// 当前请求不是一个multipart请求
		errorCodeMap.put(MultipartException.class.getName(), 10101);
		// Insert或Update数据时违反了完整性，例如违反了唯一性限制，请检查对应实体类约束条件
		errorCodeMap.put(DataIntegrityViolationException.class.getName(), 10006);
		// security密码出错异常
		errorCodeMap.put(BadCredentialsException.class.getName(), 10222);
		// security用户名不存在异常
		errorCodeMap.put(UsernameNotFoundException.class.getName(), 10225);
		// security用户已被禁用
		errorCodeMap.put(DisabledException.class.getName(), 10220);
		// security账户锁定
		errorCodeMap.put(LockedException.class.getName(), 10226);
		// security账户过期
		errorCodeMap.put(AccountExpiredException.class.getName(), 10227);
		// security证书过期
		errorCodeMap.put(CredentialsExpiredException.class.getName(), 10228);
		// security权限不足
		errorCodeMap.put(AccessDeniedException.class.getName(), 10001);
		// security没有登录用户
		errorCodeMap.put(InsufficientAuthenticationException.class.getName(), 10005);
		// 接口不支持当前发送请求的方式
		errorCodeMap.put(HttpRequestMethodNotSupportedException.class.getName(), 10003);
		// 邮件发送常见的异常类型
		errorCodeMap.put(MailSendException.class.getName(), 10510);
		// 邮件消息传递类异常
		errorCodeMap.put(MessagingException.class.getName(), 10511);
		// 参数转换错误
		errorCodeMap.put(MethodArgumentTypeMismatchException.class.getName(), 10007);
		// 参数绑定错误，请检查传入参数
		errorCodeMap.put(BindException.class.getName(), 10008);
	}

	/**
	 * 根据异常获取对应code
	 * 
	 * @param e 异常类
	 * @return 对应的code
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2019年2月11日 上午11:18:41
	 */
	public static Integer getCode(Exception e) {
		return errorCodeMap.get(e.getClass().getName());
	}

}
